package work.timejay.utils;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import work.timejay.entity.User;
import work.timejay.exception.TimeJayException;

/**
 * @className:LoginHelper.java
 * @author:王文杰
 * @version:1.0.0
 * @description:登录工具类
 * @createTime 2023年11月22日 10:18:00
 */
public class LoginHelper {
    private static final String LOGIN_KEY = "timeJay:login";

    /**
     * 登录
     *
     * @param userId
     * @param user
     */
    public static void login(Long userId, User user) {
        StpUtil.login(userId);
        SaHolder.getStorage().set(LOGIN_KEY, user);
        StpUtil.getSession().set(LOGIN_KEY, user);
    }

    /**
     * 登录
     *
     * @param userId
     * @param user
     */
    public static void loginByJson(Long userId, JSONObject user) {
        StpUtil.login(userId);
        SaHolder.getStorage().set(LOGIN_KEY, user);
        StpUtil.getSession().set(LOGIN_KEY, user);
    }

    /**
     * 获取登录信息
     */
    public static JSONObject loginUserInfoByJson() {
        Object jsonStr = SaHolder.getStorage().get(LOGIN_KEY);
        if (jsonStr != null) {
            return JSONUtil.parseObj(jsonStr);
        }
        jsonStr =  StpUtil.getSession().get(LOGIN_KEY);
        if (jsonStr == null) {
            throw TimeJayException.fail("500", "账户登录异常");
        }
        JSONObject user = JSONUtil.parseObj(jsonStr);
        SaHolder.getStorage().set(LOGIN_KEY, user);
        return user;
    }

    /**
     * 获取登录信息
     */
    public static User loginUserInfo() {
        User user = (User) SaHolder.getStorage().get(LOGIN_KEY);
        if (user != null) {
            return user;
        }
        user = (User) StpUtil.getSession().get(LOGIN_KEY);
        if (user == null) {
            throw TimeJayException.fail("500", "账户登录异常");
        }
        SaHolder.getStorage().set(LOGIN_KEY, user);
        return user;
    }
}
